package com.skt.domain.DTO;

import lombok.Data;

import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDate;

/**
 * 服装数据传输对象（用于接收前端提交的服装信息，如新增、编辑等）
 *
 * 说明：
 * - DB（数据库表）：`costume` 表，存储服装库存数据。
 * - PO（Persistent Object）：`Costume` 实体类，与数据库表结构一致。
 * - DTO（Data Transfer Object）：本类，用于接收前端传入的服装数据，字段由业务输入需求决定。
 * - VO（View Object）：如 `CostumeVO`，用于返回前端展示（不含敏感或冗余字段，如成本价等）。
 *
 * 使用场景：
 * - 创建新服装：需提供 name, category, size, rentalPrice 等必填字段
 * - 更新服装信息：部分字段可选，但 ID 由路径或上下文传入，不在此 DTO 中包含
 *
 * 校验规则：
 * - 必填字段使用 @NotBlank / @NotNull
 * - 金额字段限制精度与范围
 * - 枚举类字段（如 status）在 Service 层进一步校验合法性
 */
@Data
public class CostumeDTO {

    /**
     * 服装名称
     */
    @NotBlank(message = "服装名称不能为空")
    private String name;

    /**
     * 类别：古装/现代/民族/舞台特效等（前端应提供选项，此处仅校验非空）
     */
    @NotBlank(message = "服装类别不能为空")
    private String category;

    /**
     * 尺码：S/M/L/XL/定制等
     */
    @NotBlank(message = "尺码不能为空")
    private String size;

    /**
     * 颜色（可选）
     */
    private String color;

    /**
     * 品牌/来源（可选）
     */
    private String brand;

    /**
     * 购入日期（可选）
     */
    private LocalDate purchaseDate;

    /**
     * 购入价格（元），可选，但若提供需 ≥ 0
     */
    @DecimalMin(value = "0.00", message = "购入价格不能为负数")
    private BigDecimal price;

    /**
     * 日租金（元），必须提供且 > 0
     */
    @NotNull(message = "日租金不能为空")
    @DecimalMin(value = "0.01", message = "日租金必须大于0")
    private BigDecimal rentalPrice;

    /**
     * 状态：1-可租，2-已租，3-维修中，4-报废
     * 虽为必填，但新增时通常默认为 1（可租），前端可不传，由后端设置；
     * 若前端传，则需校验值范围（建议在 Service 层校验）
     */
    private Byte status;

    /**
     * 描述（材质、特点等，可选）
     */
    private String description;

    /**
     * 图片URL（可选）
     */
    @Pattern(regexp = "^(https?://.+|/?.+\\.(jpg|jpeg|png|gif|webp))$",
            message = "图片URL格式不正确")
    private String imageUrl;
}